package com.vpen.account.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.session.HttpSessionEventPublisher;
import org.springframework.session.data.redis.RedisIndexedSessionRepository;
import org.springframework.session.security.SpringSessionBackedSessionRegistry;

/**
 * 自己注入的bean都在这在这里
 *
 * @author vpen
 */
@Configuration
public class BeanConfig {


    /**
     * 装配BCryptPasswordEncoder用户密码的匹配
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }


    /**
     * 监听session的创建和销毁，防用户重复登录
     */
    @Bean
    public HttpSessionEventPublisher httpSessionEventPublisher() {
        return new HttpSessionEventPublisher();
    }

    /**
     * 对加密的的密码解密拦截器
     */
//    @Bean
//    public LoginPasswordDecryptFilter loginPasswordDecryptFilter() {
//        return new LoginPasswordDecryptFilter();
//    }


    /**
     * 不能往ioc容器注入这个bean，否则security会自动注册的
     *
     * @desc 使用让security 使用session
     * @author 韦鹏
     * @date 2022/7/15 15:04
     **/
    @Bean
    @SuppressWarnings("unchecked")
    public SpringSessionBackedSessionRegistry sessionRegistry(RedisIndexedSessionRepository sessionRepository) {
        return new SpringSessionBackedSessionRegistry(sessionRepository);
    }


    /**
     * @desc redis保存回话工厂
     * @author 韦鹏
     * @date 2022/7/15 15:04
     **/
    @Bean
    public RedisIndexedSessionRepository redisIndexedSessionRepository(RedisTemplate<Object, Object> redisTemplate) {
        return new RedisIndexedSessionRepository(redisTemplate);
    }

}
